home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / nevow / json.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-03-23  |  13KB  |  322 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''
  5. JavaScript Object Notation.
  6.  
  7. This is not (nor does it intend to be) a faithful JSON implementation, but it
  8. is kind of close.
  9. '''
  10. import re
  11. import types
  12. from nevow.inevow import IAthenaTransportable
  13. from nevow import rend, page, flat, tags
  14.  
  15. class ParseError(ValueError):
  16.     pass
  17.  
  18. whitespace = re.compile('([\\r\\n\\t\\ ]+|/\\*.*?\\*/|//[^\\n]*[\\n])', re.VERBOSE + re.DOTALL)
  19. openBrace = re.compile('{')
  20. closeBrace = re.compile('}')
  21. openSquare = re.compile('\\[')
  22. closeSquare = re.compile('\\]')
  23.  
  24. class StringTokenizer(object):
  25.     '''
  26.     because r\'(?<!\\)"([^"]+|\\")*(?<!\\)"\'
  27.     '''
  28.     
  29.     def match(self, s):
  30.         if not s.startswith('"'):
  31.             return None
  32.         bits = []
  33.         SLASH = '\\'
  34.         IT = iter(s)
  35.         bits = [
  36.             IT.next()]
  37.         for char in IT:
  38.             bits.append(char)
  39.             if char == SLASH:
  40.                 
  41.                 try:
  42.                     bits.append(IT.next())
  43.                 except StopIteration:
  44.                     s.startswith('"')
  45.                     s.startswith('"')
  46.                     return None
  47.                 
  48.  
  49.             s.startswith('"')<EXCEPTION MATCH>StopIteration
  50.             if char == '"':
  51.                 self.matched = ''.join(bits)
  52.                 return self
  53.         
  54.  
  55.     
  56.     def group(self, num):
  57.         return self.matched
  58.  
  59.  
  60. string = StringTokenizer()
  61. identifier = re.compile('[A-Za-z_][A-Za-z_0-9]*')
  62. colon = re.compile(':')
  63. comma = re.compile(',')
  64. true = re.compile('true')
  65. false = re.compile('false')
  66. null = re.compile('null')
  67. floatNumber = re.compile('-?([1-9][0-9]*|0)(\\.[0-9]+)([eE][-+]?[0-9]+)?')
  68. longNumber = re.compile('-?([1-9][0-9]*|0)([eE][-+]?[0-9]+)?')
  69.  
  70. class StringToken(str):
  71.     pass
  72.  
  73.  
  74. class IdentifierToken(str):
  75.     pass
  76.  
  77.  
  78. class WhitespaceToken(object):
  79.     pass
  80.  
  81.  
  82. def jsonlong(s):
  83.     if 'e' in s:
  84.         (m, e) = map(long, s.split('e', 1))
  85.     else:
  86.         m = long(s)
  87.         e = 0
  88.     return m * 10 ** e
  89.  
  90. actions = [
  91.     (whitespace, (lambda s: (WhitespaceToken, s))),
  92.     (openBrace, (lambda s: ('{', s))),
  93.     (closeBrace, (lambda s: ('}', s))),
  94.     (openSquare, (lambda s: ('[', s))),
  95.     (closeSquare, (lambda s: (']', s))),
  96.     (string, (lambda s: (StringToken(s), s))),
  97.     (colon, (lambda s: (':', s))),
  98.     (comma, (lambda s: (',', s))),
  99.     (true, (lambda s: (True, s))),
  100.     (false, (lambda s: (False, s))),
  101.     (null, (lambda s: (None, s))),
  102.     (identifier, (lambda s: (IdentifierToken(s), s))),
  103.     (floatNumber, (lambda s: (float(s), s))),
  104.     (longNumber, (lambda s: (jsonlong(s), s)))]
  105.  
  106. def tokenise(s):
  107.     tokens = []
  108.     while s:
  109.         for regexp, action in actions:
  110.             m = regexp.match(s)
  111.             if m:
  112.                 (tok, tokstr) = action(m.group(0))
  113.                 break
  114.                 continue
  115.         else:
  116.             raise ValueError, 'Invalid Input, %r' % (s[:10],)
  117.         if None is not WhitespaceToken:
  118.             tokens.append(tok)
  119.         
  120.         s = s[len(tokstr):]
  121.     return tokens
  122.  
  123.  
  124. def accept(want, tokens):
  125.     t = tokens.pop(0)
  126.     if want != t:
  127.         raise ParseError, 'Unexpected %r, %s expected' % (t, want)
  128.     want != t
  129.  
  130.  
  131. def parseValue(tokens):
  132.     if tokens[0] == '{':
  133.         return parseObject(tokens)
  134.     if tokens[0] == '[':
  135.         return parseList(tokens)
  136.     if tokens[0] in (True, False, None):
  137.         return (tokens.pop(0), tokens)
  138.     if type(tokens[0]) == StringToken:
  139.         return parseString(tokens)
  140.     if type(tokens[0]) in (int, float, long):
  141.         return (tokens.pop(0), tokens)
  142.     raise ParseError, 'Unexpected %r' % tokens[0]
  143.  
  144. _stringExpr = re.compile(u'(?:\\\\x(?P<unicode>[a-fA-F0-9]{2})) # Match hex-escaped unicode\n|\n(?:\\\\u(?P<unicode2>[a-fA-F0-9]{4})) # Match hex-escaped high unicode\n|\n(?P<control>\\\\[fbntr\\\\"]) # Match escaped control characters\n', re.VERBOSE)
  145. _controlMap = {
  146.     u'\\f': u'\x0c',
  147.     u'\\b': u'\x08',
  148.     u'\\n': u'\n',
  149.     u'\\t': u'\t',
  150.     u'\\r': u'\r',
  151.     u'\\"': u'"',
  152.     u'\\\\': u'\\' }
  153.  
  154. def _stringSub(m):
  155.     u = m.group('unicode')
  156.     if u is None:
  157.         u = m.group('unicode2')
  158.     
  159.     if u is not None:
  160.         return unichr(int(u, 16))
  161.     c = m.group('control')
  162.     return _controlMap[c]
  163.  
  164.  
  165. def parseString(tokens):
  166.     if type(tokens[0]) is not StringToken:
  167.         raise ParseError, 'Unexpected %r' % tokens[0]
  168.     type(tokens[0]) is not StringToken
  169.     s = _stringExpr.sub(_stringSub, tokens.pop(0)[1:-1].decode('utf-8'))
  170.     return (s, tokens)
  171.  
  172.  
  173. def parseIdentifier(tokens):
  174.     if type(tokens[0]) is not IdentifierToken:
  175.         raise ParseError('Unexpected %r' % (tokens[0],))
  176.     type(tokens[0]) is not IdentifierToken
  177.     return (tokens.pop(0), tokens)
  178.  
  179.  
  180. def parseList(tokens):
  181.     l = []
  182.     tokens.pop(0)
  183.     first = True
  184.     while tokens[0] != ']':
  185.         if not first:
  186.             accept(',', tokens)
  187.         
  188.         first = False
  189.         (value, tokens) = parseValue(tokens)
  190.         l.append(value)
  191.     accept(']', tokens)
  192.     return (l, tokens)
  193.  
  194.  
  195. def parseObject(tokens):
  196.     o = { }
  197.     tokens.pop(0)
  198.     first = True
  199.     while tokens[0] != '}':
  200.         if not first:
  201.             accept(',', tokens)
  202.         
  203.         first = False
  204.         (name, tokens) = parseString(tokens)
  205.         accept(':', tokens)
  206.         (value, tokens) = parseValue(tokens)
  207.         o[name] = value
  208.     accept('}', tokens)
  209.     return (o, tokens)
  210.  
  211.  
  212. def parse(s):
  213.     '''
  214.     Return the object represented by the JSON-encoded string C{s}.
  215.     '''
  216.     tokens = tokenise(s)
  217.     (value, tokens) = parseValue(tokens)
  218.     if tokens:
  219.         raise ParseError, 'Unexpected %r' % tokens[0]
  220.     tokens
  221.     return value
  222.  
  223.  
  224. class CycleError(Exception):
  225.     pass
  226.  
  227. _translation = []([ (o, u'\\x%02x' % (o,)) for o in range(32) ])
  228. _translation.update({
  229.     ord(u'\\'): u'\\\\',
  230.     ord(u'"'): u'\\"',
  231.     ord(u'\x0c'): u'\\f',
  232.     ord(u'\x08'): u'\\b',
  233.     ord(u'\n'): u'\\n',
  234.     ord(u'\t'): u'\\t',
  235.     ord(u'\r'): u'\\r' })
  236.  
  237. def stringEncode(s):
  238.     return s.translate(_translation).encode('utf-8')
  239.  
  240.  
  241. def _serialize(obj, w, seen):
  242.     athena = athena
  243.     import nevow
  244.     if isinstance(obj, types.BooleanType):
  245.         if obj:
  246.             w('true')
  247.         else:
  248.             w('false')
  249.     elif isinstance(obj, (int, long, float)):
  250.         w(str(obj))
  251.     elif isinstance(obj, unicode):
  252.         w('"')
  253.         w(stringEncode(obj))
  254.         w('"')
  255.     elif isinstance(obj, types.NoneType):
  256.         w('null')
  257.     elif id(obj) in seen:
  258.         raise CycleError(type(obj))
  259.     elif isinstance(obj, (tuple, list)):
  260.         w('[')
  261.         for n, e in enumerate(obj):
  262.             _serialize(e, w, seen)
  263.             if n != len(obj) - 1:
  264.                 w(',')
  265.                 continue
  266.         
  267.         w(']')
  268.     elif isinstance(obj, dict):
  269.         w('{')
  270.         for k, v in enumerate(obj.iteritems()):
  271.             _serialize(k, w, seen)
  272.             w(':')
  273.             _serialize(v, w, seen)
  274.             if n != len(obj) - 1:
  275.                 w(',')
  276.                 continue
  277.         
  278.         w('}')
  279.     elif isinstance(obj, (athena.LiveFragment, athena.LiveElement)):
  280.         _serialize(obj._structured(), w, seen)
  281.     elif isinstance(obj, (rend.Fragment, page.Element)):
  282.         wrapper = tags.div(xmlns = 'http://www.w3.org/1999/xhtml')
  283.         w('"')
  284.         w(stringEncode(flat.flatten(wrapper[obj]).decode('utf-8')))
  285.         w('"')
  286.     else:
  287.         transportable = IAthenaTransportable(obj, None)
  288.         if transportable is not None:
  289.             w('(new ' + transportable.jsClass.encode('ascii') + '(')
  290.             arguments = transportable.getInitialArguments()
  291.             for n, e in enumerate(arguments):
  292.                 _serialize(e, w, seen)
  293.                 if n != len(arguments) - 1:
  294.                     w(',')
  295.                     continue
  296.             
  297.             w('))')
  298.         else:
  299.             raise TypeError('Unsupported type %r: %r' % (type(obj), obj))
  300.         return transportable is not None
  301.  
  302. _undefined = object()
  303.  
  304. def serialize(obj = _undefined, **kw):
  305.     '''
  306.     JSON-encode an object.
  307.  
  308.     @param obj: None, True, False, an int, long, float, unicode string,
  309.     list, tuple, or dictionary the JSON-encoded form of which will be
  310.     returned.
  311.     '''
  312.     if obj is _undefined:
  313.         obj = kw
  314.     
  315.     L = []
  316.     _serialize(obj, L.append, { })
  317.     return ''.join(L)
  318.  
  319. __all__ = [
  320.     'parse',
  321.     'serialize']
  322.